﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <assert.h>
#include <math.h>

//2024.01.14比特假期作业代码题——day15

void test_15_1() {
	int a[3][2] = { 1, 2, 3, 4, 5, 6 }, * p[3];
	p[0] = a[1];
	printf("%d\n", *(p[0] + 1));
}

void test_15_2() {
	int a = 0;
	int* p = &a;
	printf("%p\n", (void*)p);
	void* q = &a;
	printf("%d\n", *(int*)q);
}
struct T {
	char name[20];
	int age;
	int sex;
}a[5], * pa = a;
void test_15_3() {
	int ret1 =scanf("%s", a[0].name);
	printf("%s\n", a[0].name);
	ret1 = scanf("%d", &pa[0].age);
	printf("%d\n", pa[0].age);
	ret1 = scanf("%d", &(pa->age));
	printf("%d\n", pa->age);
	ret1 = scanf("%d", pa->age);//错误
	printf("%d\n", pa->age);
}
int func_15(int n) {
	int prod = 1, i = 0;
	for (i = 1; i <= n; i++) {
		prod *= i;
	}
	return prod;
}
void test_15_4() {
	int n = 0;
	while (scanf("%d", &n) == 1) {
		int ret = func_15(n);
		printf("%d\n", ret);
	}
}
int fun(int a[], int n)
{
	int i, j;
	j = 0;
	for (i = 0; i < n; i++)
		if (a[i] % 2 == 1)
		{
			a[j] = a[i];
			j++;
		}
	return j;
}
void test_15_5() {
	int a[9] = { 9,1,4,2,3,6,5,8,7 };
	int ret = fun(a, 9);
	printf("%d\n", ret);
}

//寻找奇数——算法工程师、快手、穷举、查找、数学、2019——简单
//描述
//现在有一个长度为 n 的正整数序列，其中只有一种数值出现了奇数次，其他数值均出现偶数次，请你找出那个出现奇数次的数值。
//数据范围：
//1≤n≤2×10^6
//输入描述：
//第一行：一个整数n，表示序列的长度。第二行：n个正整数ai，两个数中间以空格隔开。
//输出描述：
//一个数，即在序列中唯一出现奇数次的数值。
//示例1
//输入：
//5
//2 1 2 3 1
//输出：
//3
//示例2
//输入：
//1
//1
//输出：
//1
void test_15_6() {
	int n = 0;
	while (scanf("%d", &n) == 1) {
		int* p = (int*)calloc(n, sizeof(int));
		assert(p);
		int num = 0;
		for (int i = 0; i < n; i++) {
			scanf("%d", &p[i]);
			num ^= p[i];
		}
		printf("%d\n", num);
		free(p);
	}
}
//寻找峰值——数组、查找——中等
//描述
//给定一个长度为n的数组nums，请你找到峰值并返回其索引。数组可能包含多个峰值，在这种情况下，返回任何一个所在位置即可。
//1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
//2.假设 nums[-1] = nums[n] =−∞
//3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
//4.你可以使用O(logN)的时间复杂度实现此问题吗？
//数据范围：
//1≤nums.length≤2×10^5
//−2^31<= nums[i] <= 2^31−1
//如输入[2, 4, 1, 2, 7, 8, 4]时，会形成两个山峰，一个是索引为1，峰值为4的山峰，另一个是索引为5，峰值为8的山峰，如下图所示：
//示例1
//输入：
//	[2, 4, 1, 2, 7, 8, 4]
//返回值：
//1
//说明：
//4和8都是峰值元素，返回4的索引1或者8的索引5都可以
//示例2
//输入：
//[1, 2, 3, 1]
//返回值：
//2
//说明：
//3 是峰值元素，返回其索引 2
int findPeakElement(int* nums, int numsLen) {
	// write code here
	assert(nums);
	int ans = 0;
	int l = 0, r = numsLen - 1;
	while (l < r) {
		if (nums[l] <= nums[l + 1]) {
			l++;
		}
		else {
			return l;
		}
		if (nums[r] <= nums[r - 1]) {
			r--;
		}
		else {
			return r;
		}
		return l;
	}
	return ans;
}
void test_15_7() {
	int n = 0;
	while (scanf("%d", &n) == 1) {
		int* p = (int*)calloc(n, sizeof(int));
		assert(p);
		for (int i = 0; i < n; i++) {
			scanf("%d", &p[i]);
		}
		int ret = findPeakElement(p, n);
		printf("%d\n", ret);
	}
}
